class Filter {
  str = '';

  text(str: string) {
    if (str !== null && str !== undefined) {
      this.str = str;
    } else {
      this.str = '';
    }
    return this;
  }

  /**
   * 过滤掉所有的空字符，仅保留非空字符
   * @returns {Filter}
   */
  removeSpace() {
    this.str = this.str.replace(/\s+/g, '');
    return this;
  }

  /**
   * 过滤掉所有的数字
   * @returns {Filter}
   */
  removeDigit() {
    this.str = this.str.replace(/\d+/g, '');
    return this;
  }

  /**
   * 去除数字之外的字符，仅保留数字
   * @returns {Filter}
   */
  reserveDigit() {
    this.str = this.str.replace(/\D+/g, '');
    return this;
  }

  /**
   * 去除数字之外的字符，仅保留数字和小数点
   * @returns {Filter}
   */
  reserveDigitDot() {
    this.str = this.str.replace(/[^\d.]/g, '');
    return this;
  }

  //保留两位小数
  keepTwoDecimal() {
    let index = this.str.indexOf('.');
    if (index > -1) {
      this.str = this.str.slice(0, index + 3);
      return this;
    }
    return this;
  }
  //转为大写
  toUpperCase() {
    this.str = this.str.toUpperCase();
    return this;
  }
  //转为小写
  toLowerCase() {
    this.str = this.str.toLowerCase();
    return this;
  }

  /**
   * 移除以0开头的数字
   * @returns {Filter}
   */
  removeLeadingZero() {
    this.str = this.str.replace(/^0+(?=\d)/g, '');
    return this;
  }
  /**
   * 移除所有汉字、数字、英文大小写以及"·.,，"（\u00B7\u002e\u002c，）之外的字符
   * @returns {Filter}
   */
  removeSpecial() {
    this.str = this.str.replace(
      /[^，\u4E00-\u9FA5\u3400-\u4DB5\u9FB4-\u9FBB\u2E81\u2E84\u2E88\u2E8B\u2E8C\u2E97\u2EA7\u2EAA\u2EAE\u2EB3\u2EB6\u2EB7\u2EBB\u2ECA\uF92C\uF979\uF995\uF9E7\uF9F1\uFA0C\uFA0D\uFA0E\uFA0F\uFA11\uFA13\uFA14\uFA18\uFA1F\uFA20\uFA21\uFA23\uFA24\uFA27\uFA28\uFA29\u00B7a-zA-Z0-9\u002e\u002c\u2022]/g,
      '',
    );
    return this;
  }

  /**
   * 地址特殊字符校验
   * 移除所有汉字、字母、数字、特殊字符＊（）()-，_《》「」『』【】“”之外的字符
   * @returns {Filter}
   */
  removeAddressSpecial() {
    this.str = this.str.replace(
      /[^\u4E00-\u9FA5\u3400-\u4DB5\u9FB4-\u9FBB\u2E81\u2E84\u2E88\u2E8B\u2E8C\u2E97\u2EA7\u2EAA\u2EAE\u2EB3\u2EB6\u2EB7\u2EBB\u2ECA\uF92C\uF979\uF995\uF9E7\uF9F1\uFA0C\uFA0D\uFA0E\uFA0F\uFA11\uFA13\uFA14\uFA18\uFA1F\uFA20\uFA21\uFA23\uFA24\uFA27\uFA28\uFA29a-zA-Z0-9\uff0a\uff08\uff09\u0028\u0029\u002d\uff0c\u005f\u300a\u300b\u300c\u300d\u300e\u300f\u3010\u3011\u301d\u301e]/g,
      '',
    );
    return this;
  }
  /**
   * 移除汉字、字母、英文点“.”、分节符“•”之外的字符
   * @returns {Filter}
   */
  removeOther() {
    this.str = this.str.replace(
      /[^\u4E00-\u9FA5\u3400-\u4DB5\u9FB4-\u9FBB\u2E81\u2E84\u2E88\u2E8B\u2E8C\u2E97\u2EA7\u2EAA\u2EAE\u2EB3\u2EB6\u2EB7\u2EBB\u2ECA\uF92C\uF979\uF995\uF9E7\uF9F1\uFA0C\uFA0D\uFA0E\uFA0F\uFA11\uFA13\uFA14\uFA18\uFA1F\uFA20\uFA21\uFA23\uFA24\uFA27\uFA28\uFA29\u002ea-zA-Z\u2022]/g,
      '',
    );
    return this;
  }

  /**
   * 移除数字、字母之外的字符
   * @returns {Filter}
   */
  removeForId() {
    this.str = this.str.replace(/[^a-zA-Z0-9]/g, '');
    return this;
  }

  removeForCertificate() {
    this.str = this.str
      .replace(
        /[^\u4E00-\u9FA5\u3400-\u4DB5\u9FB4-\u9FBB\u2E81\u2E84\u2E88\u2E8B\u2E8C\u2E97\u2EA7\u2EAA\u2EAE\u2EB3\u2EB6\u2EB7\u2EBB\u2ECA\uF92C\uF979\uF995\uF9E7\uF9F1\uFA0C\uFA0D\uFA0E\uFA0F\uFA11\uFA13\uFA14\uFA18\uFA1F\uFA20\uFA21\uFA23\uFA24\uFA27\uFA28\uFA29a-zA-Z0-9]/g,
        '',
      )
      .toUpperCase();
    return this;
  }

  //移除汉字、字母、数字中间点之外的字符
  removeForVehicle() {
    this.str = this.str.replace(
      /[^\u00B7\u4E00-\u9FA5\u3400-\u4DB5\u9FB4-\u9FBB\u2E81\u2E84\u2E88\u2E8B\u2E8C\u2E97\u2EA7\u2EAA\u2EAE\u2EB3\u2EB6\u2EB7\u2EBB\u2ECA\uF92C\uF979\uF995\uF9E7\uF9F1\uFA0C\uFA0D\uFA0E\uFA0F\uFA11\uFA13\uFA14\uFA18\uFA1F\uFA20\uFA21\uFA23\uFA24\uFA27\uFA28\uFA29\u2022a-zA-Z0-9]/g,
      '',
    );
    return this;
  }
  //车架号码
  removeForFram() {
    this.str = this.str.replace(/[^a-zA-Z0-9]|[IOQ]/g, '');
    return this;
  }

  strToUpperCase() {
    this.str = this.str.toUpperCase();
    return this;
  }

  /**
   * 告知项特殊字符校验
   * 移除所有汉字、数字、英文大小写以及"·.|\-,"之外的字符
   * @returns {Filter}
   */
  removeDiscSpecial() {
    const patternSpecial = /^[a-zA-Z0-9\u4E00-\u9FA5\u3400-\u4DB5\u9FB4-\u9FBB\u2E81\u2E84\u2E88\u2E8B\u2E8C\u2E97\u2EA7\u2EAA\u2EAE\u2EB3\u2EB6\u2EB7\u2EBB\u2ECA\uF92C\uF979\uF995\uF9E7\uF9F1\uFA0C\uFA0D\uFA0E\uFA0F\uFA11\uFA13\uFA14\uFA18\uFA1F\uFA20\uFA21\uFA23\uFA24\uFA27\uFA28\uFA29(.|\-)]*$/g;
    if (!this.str.match(patternSpecial)) {
      this.str = '';
    }
    return this;
  }
  /**
   * 告知项体重可录入大于等于0的数,且最多保留两位小数
   * @returns {Filter}
   */
  reserveDiscHeight() {
    const patternWeight = /^([1-9]\d*|0)(\.\d{0,2})?$/g;
    if (!patternWeight.test(this.str)) {
      this.str = '';
    }
    return this;
  }
  /**
   * 去除数字之外的字符，仅保留大于等于零的整数且01001等不可取
   * @returns {Filter}
   */
  reserveDiscDigit() {
    const patternNumber = /^([1-9]\d*|0)$/g;
    if (!patternNumber.test(this.str)) {
      this.str = '';
    }
    return this;
  }

  /**
   * 税收居民姓名英文地址,只能录入英文字母,且名字中间仅允许录入空格、英文逗号、中间点“·”、缩写点“.”
   * @returns {Filter}
   */
  taxName() {
    this.str = this.str.replace(/[^a-zA-Z\u002e\u002c\u00B7 ]/g, '');
    return this;
  }
  /**
   * 如实告知说明内容特殊字符校验
   * 只能输入汉字、字母、数字 .|\-,!。;（）:%、?
   * @returns {Filter}
   */
  limitSpecialChar() {
    // eslint-disable-next-line no-useless-escape
    this.str = this.str.replace(/[^\a-\z\A-\Z0-9\u4E00-\u9FA5]/g, '');
    return this;
  }

  /**
   * 过滤掉\:*?"<>｜
   * @returns {Filter}
   */
  removeCommonSpecial() {
    this.str = this.str.replace(/[\\:*?"<>｜]/g, '');
    return this;
  }

  /**
   * 客户管理文字录入校验
   * 只能录入汉字、字母、英文点“.”、分节符“·”。必须为半角字符。
   */
  customerSalesman() {
    this.str = this.str.replace(
      /[^\u4E00-\u9FA5\u3400-\u4DB5\u9FB4-\u9FBB\u2E81\u2E84\u2E88\u2E8B\u2E8C\u2E97\u2EA7\u2EAA\u2EAE\u2EB3\u2EB6\u2EB7\u2EBB\u2ECA\uF92C\uF979\uF995\uF9E7\uF9F1\uFA0C\uFA0D\uFA0E\uFA0F\uFA11\uFA13\uFA14\uFA18\uFA1F\uFA20\uFA21\uFA23\uFA24\uFA27\uFA28\uFA29a-zA-Z·.]/g,
      '',
    );
    return this;
  }
  /**
   * 产品名称搜索过滤
   * 只能输入英文字母、产品名称全拼、数字、汉字、“-”、“+”、“(”、“)”、“（）”、“、”，长度无显示，英文不区分大小写。。
   */
  productName() {
    this.str = this.str.replace(
      // eslint-disable-next-line no-useless-escape
      /[^a-zA-Z\d\u4E00-\u9FA5\u3400-\u4DB5\u9FB4-\u9FBB\u2E81\u2E84\u2E88\u2E8B\u2E8C\u2E97\u2EA7\u2EAA\u2EAE\u2EB3\u2EB6\u2EB7\u2EBB\u2ECA\uF92C\uF979\uF995\uF9E7\uF9F1\uFA0C\uFA0D\uFA0E\uFA0F\uFA11\uFA13\uFA14\uFA18\uFA1F\uFA20\uFA21\uFA23\uFA24\uFA27\uFA28\uFA29\+\(\)\（\）\、\-]/g,
      '',
    );
    return this;
  }
  /**
   * 保单名称/保单号搜索过滤
   * 输入内容只能输入英文、数字、汉字、“-”、“+”、“(”、“)”、“（）”、“•”，长度无限制，英文不区分大小写。
   */
  policyName() {
    this.str = this.str.replace(
      // eslint-disable-next-line no-useless-escape
      /[^a-zA-Z\d\u4E00-\u9FA5\u3400-\u4DB5\u9FB4-\u9FBB\u2E81\u2E84\u2E88\u2E8B\u2E8C\u2E97\u2EA7\u2EAA\u2EAE\u2EB3\u2EB6\u2EB7\u2EBB\u2ECA\uF92C\uF979\uF995\uF9E7\uF9F1\uFA0C\uFA0D\uFA0E\uFA0F\uFA11\uFA13\uFA14\uFA18\uFA1F\uFA20\uFA21\uFA23\uFA24\uFA27\uFA28\uFA29\+\(\)\（\）\·\-]/g,
      '',
    );
    return this;
  }
  /**
   * 返回结果，最后调用
   * @returns {string|XML|*|void}
   */
  result() {
    return this.str;
  }
}

const filter = new Filter();
export default filter;
